package shm.capaDatos.entidades;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import shm.capaDatos.vo.CiudadVO;
import shm.capaDatos.vo.DatosContactoVO;
import shm.capaDatos.vo.TelefonoVO;
import shm.util.Utilidad;

@Entity
public class DatosContacto implements Serializable {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id; 
	@Column(length=60,nullable = true, unique = false)
	private String nombre;
	@Column(length=200,nullable = true, unique = false)
	private String paginaWeb;
	@Column(length=100,nullable = true, unique = false)
	private String mail;
	@OneToMany(cascade = {CascadeType.PERSIST},fetch = FetchType.EAGER)
	private List<Telefono> telefonos;
	@ManyToOne
	private Ciudad ciudad;
	@Column(length=100,nullable = true, unique = false)
	private String direccion;
	@Column(length=15,nullable = true, unique = false)
	private String codigoPostal;
	private static final long serialVersionUID = 1L;
	
	public DatosContactoVO getVO(){
		List<TelefonoVO> telefonosVO = new ArrayList<TelefonoVO>();
		if(this.telefonos != null){
			for (Telefono telefono : this.telefonos) {
				TelefonoVO telefonoVO = telefono.getVO();
				telefonosVO.add(telefonoVO);
			}
		}
		CiudadVO ciudadVO = null;
		if(this.ciudad != null){
			ciudadVO = this.ciudad.getVO();
		}
		DatosContactoVO datosContactoVO = new DatosContactoVO(this.id, this.nombre,this.paginaWeb,this.mail, telefonosVO,ciudadVO,this.direccion, this.codigoPostal);
		return datosContactoVO;
	}
	public void setVO(DatosContactoVO datosContactoVO){
		if(datosContactoVO != null){
			if(datosContactoVO.getTelefonos() != null){
				List<Telefono> telefonos = new ArrayList<Telefono>();
				List<TelefonoVO> telefonosVO = datosContactoVO.getTelefonos();
	
				if (telefonosVO != null) {
					for (TelefonoVO telefonoVO : telefonosVO) {
						Telefono telefono = new Telefono();
						telefono.setVO(telefonoVO);
						telefonos.add(telefono);
					}
				}
				this.telefonos = telefonos;
			}else{
				this.telefonos = null;
			}
			this.id = datosContactoVO.getId();
			this.nombre = datosContactoVO.getNombre();
			this.paginaWeb = datosContactoVO.getPaginaWeb();
			this.mail = datosContactoVO.getMail();
			
			if(datosContactoVO.getCiudad() != null){
				if(this.ciudad == null){
					this.ciudad = new Ciudad();
				}
				this.ciudad.setVO(datosContactoVO.getCiudad());
			}else{
				this.ciudad = null;
			}
			this.direccion = datosContactoVO.getDireccion();
			this.codigoPostal = datosContactoVO.getCodigoPostal();
		}
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getPaginaWeb() {
		return paginaWeb;
	}
	public void setPaginaWeb(String paginaWeb) {
		this.paginaWeb = paginaWeb;
	}
	public String getMail() {
		return mail;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	public List<Telefono> getTelefonos() {
		return telefonos;
	}
	public void setTelefonos(List<Telefono> telefonos) {
		this.telefonos = telefonos;
	}
	public Ciudad getCiudad() {
		return ciudad;
	}
	public void setCiudad(Ciudad ciudad) {
		this.ciudad = ciudad;
	}
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public String getCodigoPostal() {
		return codigoPostal;
	}
	public void setCodigoPostal(String codigoPostal) {
		this.codigoPostal = codigoPostal;
	}
	@Override
	public boolean equals(Object datosContacto){
		if(datosContacto == null){
			
			return false;
		}else{
			if(!Utilidad.iguales(this.nombre,((DatosContacto)datosContacto).getNombre())){
				return false;
			}else{
				if(!Utilidad.iguales(this.paginaWeb,((DatosContacto)datosContacto).getPaginaWeb())){
					return false;
				}else{
					if(!Utilidad.iguales(this.mail,((DatosContacto)datosContacto).getMail())){
						return false;
					}else{
						if(!Utilidad.iguales(this.ciudad,((DatosContacto)datosContacto).getCiudad())){
							return false;
						}else{
							if(!Utilidad.iguales(this.codigoPostal,((DatosContacto)datosContacto).getCodigoPostal())){
								return false;
							}else{
								if(!Utilidad.iguales(this.direccion,((DatosContacto)datosContacto).getDireccion())){
									return false;
								}else{
									return telefonosIguales(this.telefonos,((DatosContacto)datosContacto).getTelefonos());//verificar si explota cuando es nulo telefonos)
								}
							}
						}
					}
				}
			}
		}
	}
	public void limpiarIdsTelefonos(){
		if(this.telefonos != null){
			Iterator<Telefono> i = this.telefonos.iterator();
			while (i.hasNext()){
				i.next().setId(null);
			}
		}
	}
	private boolean telefonosIguales(List<Telefono> t1, List<Telefono> t2){
		if(t1 == null && t2 == null){
			return true;
		}else{
			if(t1 != null && t2 != null){
				if(t1.size() != t2.size()){
					return false;
				}else{
					for(int i = 0; i<t1.size(); i++){
						if(!t1.get(i).equals(t2.get(i))){
							return false;
						}
					}
					return true;
				}
			}else{
				return false;
			}
		}
		
	}

}
